package br.unidocs.servico;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.eclipse.persistence.exceptions.DatabaseException;

import br.unidocs.exceptions.BancoException;
import br.unidocs.modelo.entidade.Noticia;

/**
 * Session Bean implementation class UsuarioServicesImpl
 */
@Stateless
// nao mantem estado entre chamadas; o metodo processa e te devolve algo. as
// informacoes gravadas dentro da classe serao perdidas;
// tem Statefull, que mantem na memoria. e o terceiro é Nested tipo de servicos
// - consumir mensagens;
public class NoticiaEJBImpl implements NoticiaEJB {

	@PersistenceContext(unitName = "UnidocsPU")
	EntityManager em;

	/**
	 * Default constructor.
	 */
	public NoticiaEJBImpl() {
		//
	}

	@Override
	// metodo criado porque estamos sobrescrevendo o metodo da interface
	@SuppressWarnings("unchecked")
	public List<Noticia> listaUltimasNoticias() {
		return em.createNamedQuery("listaNoticiasPorDataDesc")
				.setMaxResults(10).getResultList();
	}

	// @Override
	// @SuppressWarnings("unchecked")
	// public List<Noticia> listaNoticias() {
	// return em
	// .createQuery(
	// "select n from Noticia n order by n.dataCriacao desc")
	// .getResultList(); // n é idem * aqui
	// }

	@Override
	public Noticia obterPorId(Integer id) {
		return em.find(Noticia.class, id);
	}

	@Override
	public void criaNoticia(Noticia novaNoticia) {
		em.persist(novaNoticia);
	}

	@Override
	public void atualizaNoticia(Noticia noticia) {
		em.merge(noticia);
	}

	@Override
	public void excluiNoticia(int id) {
		em.remove(em.find(Noticia.class, id));
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Noticia> listaNoticias() {
		return em.createNamedQuery("listaNoticias").getResultList();
	}

	@Override
	public void excluiNoticia(Noticia n) {
		// 1 - apaga registro no banco de dados
		try {
			if (!em.contains(n)) {
				n = em.find(Noticia.class, n.getId());
			}

			em.remove(n);
		} catch (RuntimeException e) {
			if (e instanceof DatabaseException) {
				throw new BancoException(
						"Não foi possível excluir esta notícia.", e);
			} else {
				throw e;
			}
		}
	}

}
